home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / gnustuff / tos / updates / update20.zoo / lib / bcopy.s < prev    next >
Encoding:
Text File  |  1992-04-19  |  4.1 KB  |  214 lines

  1.  
  2. |    new version of bcopy, memcpy and memmove
  3. |    handles overlap, odd/even alignment
  4. |    uses movem to copy 256 bytes blocks faster.
  5. |    Alexander Lehmann    alexlehm@iti.informatik.th-darmstadt.de
  6. |    sortof inspired by jrb's bcopy
  7.  
  8.     .text
  9.     .even
  10.     .globl _bcopy
  11.     .globl _lbcopy
  12.     .globl _memcpy
  13.     .globl _memmove
  14.  
  15. |    void *memcpy( void *dest, const void *src, size_t len );
  16. |    void *memmove( void *dest, const void *src, size_t len );
  17. |    returns dest
  18. |    functions are aliased
  19.  
  20. _memcpy:
  21. _memmove:
  22.     movl    sp@(4),a1    | dest
  23.     movl    sp@(8),a0    | src
  24.     jra    common        | the rest is samea as bcopy
  25.  
  26. |    void bcopy( const void *src, void *dest, size_t length );
  27. |    void lbcopy( const void *src, void *dest, size_t length );
  28. |    return value not used (returns src)
  29. |    functions are aliased
  30.  
  31. _bcopy:
  32. _lbcopy:
  33.     movl    sp@(4),a0    | src
  34.     movl    sp@(8),a1    | dest
  35. common:    movl    sp@(12),d0    | length
  36.     jeq    exit        | length==0? (size_t)
  37.  
  38.                 | a0 src, a1 dest, d0.l length
  39.     movel    d2,sp@-
  40.  
  41.     | overlay ?
  42.     cmpl    a0,a1
  43.     jgt    top_down
  44.  
  45.     movw    a0,d1        | test for alignment
  46.     movw    a1,d2
  47.     eorw    d2,d1
  48.     btst    #0,d1        | one odd one even ?
  49.     jne    slow_copy
  50.     btst    #0,d2        | both even ?
  51.     jeq    both_even
  52.     movb    a0@+,a1@+    | copy one byte, now we're both even
  53.     subql    #1,d0
  54. both_even:
  55.     clrw    d1        | save length less 256
  56.     movb    d0,d1
  57.     lsrl    #8,d0        | number of 256 bytes blocks
  58.     jeq    less256
  59.     movml    d3-d7/a2-a6,sp@-    | d2 is already saved
  60. copy256:
  61.     movml    a0@+,d2-d7/a2-a6    | copy 5*44+36=256 bytes
  62.     movml    d2-d7/a2-a6,a1@
  63.     movml    a0@+,d2-d7/a2-a6
  64.     movml    d2-d7/a2-a6,a1@(44)
  65.     movml    a0@+,d2-d7/a2-a6
  66.     movml    d2-d7/a2-a6,a1@(88)
  67.     movml    a0@+,d2-d7/a2-a6
  68.     movml    d2-d7/a2-a6,a1@(132)
  69.     movml    a0@+,d2-d7/a2-a6
  70.     movml    d2-d7/a2-a6,a1@(176)
  71.     movml    a0@+,d2-d7/a2-a4
  72.     movml    d2-d7/a2-a4,a1@(220)
  73.     lea    a1@(256),a1        | increment dest, src is already
  74.     subql    #1,d0
  75.     jne    copy256         | next, please
  76.     movml    sp@+,d3-d7/a2-a6
  77. less256:            | copy 16 bytes blocks
  78.     movw    d1,d0
  79.     lsrw    #2,d0        | number of 4 bytes blocks
  80.     jeq    less4        | less that 4 bytes left
  81.     movw    d0,d2
  82.     negw    d2
  83.     andw    #3,d2        | d2 = number of bytes below 16 (-n)&3
  84.     subqw    #1,d0
  85.     lsrw    #2,d0        | number of 16 bytes blocks minus 1, if d2==0
  86.     addw    d2,d2        | offset in code (movl two bytes)
  87.     jmp    pc@(2,d2:w)    | jmp into loop
  88. copy16:
  89.     movl    a0@+,a1@+
  90.     movl    a0@+,a1@+
  91.     movl    a0@+,a1@+
  92.     movl    a0@+,a1@+
  93.     dbra    d0,copy16
  94. less4:
  95.     btst    #1,d1
  96.     jeq    less2
  97.     movw    a0@+,a1@+
  98. less2:
  99.     btst    #0,d1
  100.     jeq    none
  101.     movb    a0@,a1@
  102. none:
  103. exit_d2:
  104.     movl    sp@+,d2
  105. exit:
  106.     movl sp@(4),d0        | return dest (for memcpy only)
  107.     rts
  108.  
  109. slow_copy:            | byte by bytes copy
  110.     movw    d0,d1
  111.     negw    d1
  112.     andw    #7,d1        | d1 = number of bytes blow 8 (-n)&7
  113.     addql    #7,d0
  114.     lsrl    #3,d0        | number of 8 bytes block plus 1, if d1!=0
  115.     addw    d1,d1        | offset in code (movb two bytes)
  116.     jmp    pc@(2,d1:w)    | jump into loop
  117. scopy:
  118.     movb    a0@+,a1@+
  119.     movb    a0@+,a1@+
  120.     movb    a0@+,a1@+
  121.     movb    a0@+,a1@+
  122.     movb    a0@+,a1@+
  123.     movb    a0@+,a1@+
  124.     movb    a0@+,a1@+
  125.     movb    a0@+,a1@+
  126.     subql    #1,d0
  127.     jne    scopy
  128.     jra    exit_d2
  129.  
  130. top_down:
  131.     addl    d0,a0        | a0 byte after end of src
  132.     addl    d0,a1        | a1 byte after end of dest
  133.  
  134.     movw    a0,d1        | exact the same as above, only with predec
  135.     movw    a1,d2
  136.     eorw    d2,d1
  137.     btst    #0,d1
  138.     jne    slow_copy_d
  139.  
  140.     btst    #0,d2
  141.     jeq    both_even_d
  142.     movb    a0@-,a1@-
  143.     subql    #1,d0
  144. both_even_d:
  145.     clrw    d1
  146.     movb    d0,d1
  147.     lsrl    #8,d0
  148.     jeq    less256_d
  149.     movml    d3-d7/a2-a6,sp@-
  150. copy256_d:
  151.     movml    a0@(-44),d2-d7/a2-a6
  152.     movml    d2-d7/a2-a6,a1@-
  153.     movml    a0@(-88),d2-d7/a2-a6
  154.     movml    d2-d7/a2-a6,a1@-
  155.     movml    a0@(-132),d2-d7/a2-a6
  156.     movml    d2-d7/a2-a6,a1@-
  157.     movml    a0@(-176),d2-d7/a2-a6
  158.     movml    d2-d7/a2-a6,a1@-
  159.     movml    a0@(-220),d2-d7/a2-a6
  160.     movml    d2-d7/a2-a6,a1@-
  161.     movml    a0@(-256),d2-d7/a2-a4
  162.     movml    d2-d7/a2-a4,a1@-
  163.     lea    a0@(-256),a0
  164.     subql    #1,d0
  165.     jne    copy256_d
  166.     movml    sp@+,d3-d7/a2-a6
  167. less256_d:
  168.     movw    d1,d0
  169.     lsrw    #2,d0
  170.     jeq    less4_d
  171.     movw    d0,d2
  172.     negw    d2
  173.     andw    #3,d2
  174.     subqw    #1,d0
  175.     lsrw    #2,d0
  176.     addw    d2,d2
  177.     jmp    pc@(2,d2:w)
  178. copy16_d:
  179.     movl    a0@-,a1@-
  180.     movl    a0@-,a1@-
  181.     movl    a0@-,a1@-
  182.     movl    a0@-,a1@-
  183.     dbra    d0,copy16_d
  184. less4_d:
  185.     btst    #1,d1
  186.     jeq    less2_d
  187.     movw    a0@-,a1@-
  188. less2_d:
  189.     btst    #0,d1
  190.     jeq    exit_d2
  191.     movb    a0@-,a1@-
  192.     jra    exit_d2
  193. slow_copy_d:
  194.     movw    d0,d1
  195.     negw    d1
  196.     andw    #7,d1
  197.     addql    #7,d0
  198.     lsrl    #3,d0
  199.     addw    d1,d1
  200.     jmp    pc@(2,d1:w)
  201. scopy_d:
  202.     movb    a0@-,a1@-
  203.     movb    a0@-,a1@-
  204.     movb    a0@-,a1@-
  205.     movb    a0@-,a1@-
  206.     movb    a0@-,a1@-
  207.     movb    a0@-,a1@-
  208.     movb    a0@-,a1@-
  209.     movb    a0@-,a1@-
  210.     subql    #1,d0
  211.     jne    scopy_d
  212.     jra    exit_d2
  213.  
  214.